package com.zhoug.player3.hik;

import android.text.TextUtils;

import com.zhoug.common3.Logger;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 海康错误信息
 *
 * @Author 35574
 * @Date 2020/4/28
 * @Description
 */
public class HikErrors {
    private static final String TAG = ">>>HikErrors";
    public static final Map<String, String> ERRORS;
    public static final String URL_EXPIRE="0x01b01307";//url过期
    public static final int SUCCESS=0;

    static {
        ERRORS = new HashMap<>();
        ERRORS.put("0x0173ea60", "创建 socket 失败");
        ERRORS.put("0x0173ea61", "设置 socket 地址重用失败");
        ERRORS.put("0x0173ea62", "生成 socket 地址结构失败");
        ERRORS.put("0x0173ea63", "设置 socket 缓冲区失败");
        ERRORS.put("0x0173ea64", "绑定 socket 端口失败");
        ERRORS.put("0x0173ea65", "监听 socket 失败");
        ERRORS.put("0x0173ea66", "连接 socket 失败");
        ERRORS.put("0x0173ea67", "socket 句柄无效");
        ERRORS.put("0x0173ea68", "绑定 io 完成端口队列失败");
        ERRORS.put("0x0173ea69", "iocp 发送数据失败");
        ERRORS.put("0x0173ea6a", "iocp 接收数据失败");
        ERRORS.put("0x0173ea6b", "投递 iocp 完成状态失败");
        ERRORS.put("0x0173ea6c", "iocp 接收连接失败");
        ERRORS.put("0x0173ea6d", "绑定 io 完成端口句柄失败");
        ERRORS.put("0x0173ea6e", "内存申请失败");
        ERRORS.put("0x0173ea6f", "函数参数无效");
        ERRORS.put("0x0173ea70", "功能不支持或未实现");
        ERRORS.put("0x0173ea71", "身份认证 token 无效");
        ERRORS.put("0x0173ea72", "会话 handle 无效");
        ERRORS.put("0x0173ea73", "url 格式错误");
        ERRORS.put("0x0173ea74", "数据长度超出限制范围");
        ERRORS.put("0x0173ea75", "rtsp 协议报文异常");
        ERRORS.put("0x0173ea76", "传输方式无效或不支持");
        ERRORS.put("0x0173ea77", "埋点库调用异常");
        ERRORS.put("0x0173ea78", "重复打开传输连接");
        ERRORS.put("0x0173ea79", "设置 socket 多播 ttl 失败");
        ERRORS.put("0x0173ea7b", "rsa 公钥初始化失败");
        ERRORS.put("0x0173ea7c", "rsa 公钥加密失败");
        ERRORS.put("0x0173ea7d", "aes 加密失败");
        ERRORS.put("0x0173ea7e", "base64 编码失败");
        ERRORS.put("0x0173ea7f", "获取随机数失败");
        ERRORS.put("0x0173ea80", "异步消息回调异常");
        ERRORS.put("0x0173ea81", "rtsp 会话状态无效");
        ERRORS.put("0x0173ea82", "rtsp 异步会话信息无效");
        ERRORS.put("0x0173ea83", "会话配置信息无效");
        ERRORS.put("0x0173ea85", "ip/域名转换 ip 失败");
        ERRORS.put("0x0173ea86", "发送 describe 失败");
        ERRORS.put("0x0173ea87", "接收 describe 响应超时");
        ERRORS.put("0x0173ea88", "发送 setup 失败");
        ERRORS.put("0x0173ea89", "接收 setup 响应超时");
        ERRORS.put("0x0173ea8a", "发送 play 失败");
        ERRORS.put("0x0173ea8b", "接收 play 响应超时");
        ERRORS.put("0x0173ea8c", "发送 teardown 失败");
        ERRORS.put("0x0173ea8d", "接收 teardown 响应超时");
        ERRORS.put("0x0173ea8e", "发送 options 失败");
        ERRORS.put("0x0173ea8f", "接收 options 响应超时");
        ERRORS.put("0x0173ea90", "发送 pause 失败");
        ERRORS.put("0x0173ea91", "接收 pause 响应超时");
        ERRORS.put("0x0173ea92", "发送 forceiframe 失败");
        ERRORS.put("0x0173ea93", "接收 forceiframe 响应超时");
        ERRORS.put("0x0173ea94", "发送 setparameter 失败");
        ERRORS.put("0x0173ea95", "接收 setparameter 响应超时");
        ERRORS.put("0x0173ea96", "异步接收超时");
        ERRORS.put("0x0173ea97", "数据接收不完整");
        ERRORS.put("0x0173ea98", "解析 rtsp 报文失败");
        ERRORS.put("0x0173ea99", "心跳超时(client 与 server 间)");
        ERRORS.put("0x0173ea9a", "处理接收到的数据异常");
        ERRORS.put("0x0173ea9b", "获取 server 端 udp 端口失败");
        ERRORS.put("0x0173ea9c", "创建 udp 传输失败");
        ERRORS.put("0x0173ea9d", "创建 tcp 传输失败");
        ERRORS.put("0x0173ea9e", "开启 udp 传输失败");
        ERRORS.put("0x0173ea9f", "开启 tcp 传输失败");
        ERRORS.put("0x0173eaa0", "socket 设置失败");
        ERRORS.put("0x0173eaa1", "请求端不是集群调度节点");
        ERRORS.put("0x0173eaa2", "线程句柄无效");
        ERRORS.put("0x0173eaa3", "无可用会话句柄");
        ERRORS.put("0x0173eaa4", "会话句柄已经在队列中");
        ERRORS.put("0x0173eaa5", "创建异步 io 队列失败");
        ERRORS.put("0x0173eaa6", "回调线程出现阻塞");
        ERRORS.put("0x0173eaa7", "转封装库接口调用失败");
        ERRORS.put("0x0173eaa8", "获取/设置当前程序运行路径失败");
        ERRORS.put("0x0173eaa9", "文件打开失败");
        ERRORS.put("0x0173eaaa", "json 解析失败");
        ERRORS.put("0x0173eaab", "sdp 解析失败");
        ERRORS.put("0x0173eaac", "sdk 未初始化");
        ERRORS.put("0x0173eaad", "rtsp 协议栈未初始化");
        ERRORS.put("0x0173eaae", "sdp 媒体信息少于等于 0");
        ERRORS.put("0x0173eaaf", "绝对时间转换失败");
        ERRORS.put("0x0173eab0", "buffer 长度不足");
        ERRORS.put("0x0173eab1", "多次尝试取流后依旧失败");


        //以下是根据使用中出现的情况自己添加的错误
        ERRORS.put("0x0190003e", "设备离线");
        ERRORS.put("0x0180fc0c", "没有回放资源");
        ERRORS.put(URL_EXPIRE, "url过期");
    }


    /**
     * 错误码转化成16进制
     *
     * @param errorCode
     * @return
     */
    public static String errorCodeToHexString(String errorCode) {
        if (!TextUtils.isEmpty(errorCode)) {
            try {
                errorCode = errorCode.trim();
                if (Pattern.compile("^[0-9]+$").matcher(errorCode).matches()) {
                    return "0x0" + Integer.toHexString(Integer.parseInt(errorCode));
                }
            } catch (Exception e) {
              Logger.e(TAG, "errorCodeToHexString:"+e.getMessage());
            }
        }
        return errorCode;
    }

    /**
     * 根据错误码获取错误信息
     *
     * @param errorCode 10进制的错误代码
     * @return
     */
    public static String getErrorMsg(int errorCode) {
        return getErrorMsg("0x0" + Integer.toHexString(errorCode));
    }


    /**
     * 根据错误码获取错误信息
     *
     * @param errorCode 16进制的错误代码
     * @return
     */
    public static String getErrorMsg(String errorCode) {
        if (errorCode == null) return null;
        if (!errorCode.startsWith("0x0")) {
            if (errorCode.startsWith("0x")) {
                //0x190003e
                errorCode = "0x0" + errorCode.substring(2);
            } else if (errorCode.startsWith("0")) {
                //0190003e
                errorCode = "0x0" + errorCode.substring(1);
            } else {
                errorCode = "0x0" + errorCode;
            }
        }
        String msg = ERRORS.get(errorCode);
        return msg != null ? msg : errorCode;
    }
}
